package com.oop;

import com.oop.demo06.A;
import com.oop.demo06.B;
import com.oop.demo07.Person;
import com.oop.demo07.Student;
import com.oop.demo07.Teacher;
import com.oop.demo09.Action;
/*  封装的意义
1.提供程序的安全性，保护数据
2.隐藏代码的实现细节
3.统一接口
4.系统可维护增加了
 */

//一个项目应该只有一个main方法
public class Application {

    public static void main(String[] args) {
        //类型之间的转换： 基本类型转换  高低 64 32 16 8

//        //高                 低
//        Person obj = new Student();
//
//        //  将这个对象obj转换为Student类型，就可以使用Student 类型的方法了
//        ((Student) obj).go();

        //子类转换为父类，可能会丢失自己本来的一些方法
        Student student = new Student();
        student.go();
        Person person = student;
        //person.go();//报错

    }
//    public static void main(String[] args) {
//
//        //Object > String
//        //Object > Person > Teacher
//        //Object > Person > Student
//        Object valName1 = new Student();
//
//        //System.out.println(X instanceof Y);//能不能编译通过，看X Y之间是否存在父子关系
//
//        // instanceof 比较转换
//        System.out.println(valName1 instanceof Student);//true
//        System.out.println(valName1 instanceof Person);//true
//        System.out.println(valName1 instanceof Object);//true
//        System.out.println(valName1 instanceof Teacher);//false
//        System.out.println(valName1 instanceof String);//false
//        System.out.println("============");
//        Person valName2 = new Student();
//        System.out.println(valName2 instanceof Student);//true
//        System.out.println(valName2 instanceof Person);//true
//        System.out.println(valName2 instanceof Object);//true
//        System.out.println(valName2 instanceof Teacher);//false
////        System.out.println(valName2 instanceof String);//编译报错
//        System.out.println("==========");
//        Student valName3 = new Student();
//        System.out.println(valName3 instanceof Student);//true
//        System.out.println(valName3 instanceof Person);//true
//        System.out.println(valName3 instanceof Object);//true
////        System.out.println(valName3 instanceof Teacher);//编译报错
////        System.out.println(valName3 instanceof String);//编译报错
//
//
////        //一个对象的实际类型是确定的
////        //new Student();
////        //new Person();
////
////        //可以指向的引用类型就不确定了
////        //多态：父类的引用 指向 子类
////
////        //Student 能调用的方法都是自己的或者继承父类的
////        Student s1 = new Student();
////        //Person 父类，可以指向子类，但是不能调用子类独有的方法
////        Person s2 = new Student();
////        Object s3 = new Student();
////
//////        /*
//////        子类和父类 方法都存在的情况下，且子类没有重写父类，则调用父类的
//////        若子类重写了父类，则调用子类的
//////         */
//////        //对象能执行哪些方法，主要看对象左边的类型，与右边关系不大
//////        s2.eat();
////        ((Student) s2).eat();//类型强转
////
////        s2.run();//子类重写了父类的方法，执行子类的方法
////        s1.run();
//
//        //静态方法和非静态方法区别很大
//        // 重写只与非静态方法有关
//        /*
//        b是A new出来的对象，因此调用了A的方法
//        静态方法是类的方法，而非静态是对象的方法
//        有static时，b 调用了B类的方法，因为　b 是用 B类定义的
//        没有static，b 调用的是对象的方法，而b 是用A类new的
//         */
//
//        //方法的调用只和左边 定义的数据类型 有关
//        //即  定义的是什么类就调用什么类的静态方法
//
////        A a = new A();
////        a.test();//A
////
////        //父类的引用指向了子类
////        B b = new A();//子类重写了父类的方法
////        b.test();//B
//
////        Student student = new Student();
////        student.say();
//
////        Person person = new Person();
//
////        Student student = new Student();
//
////        student.test("李");
////        student.test1();
//
//    }

}

